home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / apl / gview120.lzh / gviewsrc.lzh / XPIC.S < prev   
Text File  |  1995-02-12  |  23KB  |  1,097 lines

  1. *****************************************************************************************
  2. *                                            *
  3. *    X68000 PICture Save and Load Program    *
  4. *        Version 1.00    By 柳沢 明                *
  5. *                                            *
  6. *****************************************************************************************
  7. * アセンブラから使う時は、たぶんスタックをきちんと確保しないと正常に動きません。
  8. *
  9. * Cで使う人は、ファイルは低レベルのオープンを使って下さい。
  10. *
  11. * PICファイルは、このままでは読み書き出来ません。ヘッダーが必要です。
  12. *
  13. * 画面の初期化もチェックもしません。使う方でして下さい。
  14.  
  15. KOPIC        EQU    0
  16.  
  17.  
  18. _WRITE        EQU    $ff40
  19. _READ        EQU    $ff3f
  20. _SUPER        EQU    $ff20
  21.  
  22.         .xdef    _PicLoad
  23.     .if KOPIC
  24.         .xdef    _PicSave
  25.     .else
  26. *        .xref    _WindowXsize
  27. *        .xref    _WindowYsize
  28.     .endif
  29.         .text
  30.  
  31. */////////////////////////////////////////////////////////////////////////////////////////
  32. *    1ビット読み込みのマクロ(少しでも早くするためです)
  33. load_b1        macro
  34.         local    xx,yy
  35.         dbra    d7,xx        ビット内のポインタをチェック
  36.         move.w    #1,d0
  37.         bsr    load_bit_a    次のワードを読む
  38.         lsr.w    d0
  39.         bra.b    yy
  40. xx
  41.         lsl.w    d6
  42. yy
  43.         endm
  44. */////////////////////////////////////////////////////////////////////////////////////////
  45. *    2ビット読み込みのマクロ(少しでも早くするためです)
  46. load_b2        macro
  47.         local    xx,yy
  48.         sub.w    #2,d7        ビット内のポインタをチェック
  49.         bpl.b    xx
  50.         move.w    #2,d0
  51.         bsr    load_bit_a    次のワードを読む
  52.         bra.b    yy
  53. xx
  54.         rol.w    #2,d6
  55.         move.w    d6,d0
  56. yy
  57.         and.l    #3,d0
  58.         endm
  59.  
  60.  
  61. *****************************************************************************************
  62. *                                            *
  63. *    main                                    *
  64. *                                            *
  65. *****************************************************************************************
  66.     .if    KOPIC
  67. *////////////////////////////////////////////////////////////////////////////////////////
  68. *    PicSave(int file,int X0,int Y0,int X1,int Y1,(char *)Buff,int Size )
  69. *
  70. *    file    ファイルハンドル
  71. *    X0    左上のXの位置
  72. *    Y0    左上のYの位置
  73. *    X1    右下のXの位置
  74. *    Y1    右下のYの位置
  75. *    Buff    バッファのポインタ       ファイル入出力用のバッファです。
  76. *    Size    バッファのサイズ (128以上)
  77. *
  78.  
  79. _PicSave
  80.         move.l    sp,a0
  81.         movem.l    d3-d7/a3-a6,-(sp)
  82.         lea    work(pc),a6        ワークエリアのセット
  83.         clr.l    -(sp)
  84.         dc.w    _SUPER            スーパーバイザーへ
  85.         lea    4(sp),sp
  86.         move.l    d0,-(sp)
  87.         bsr    PicSave            セーブ
  88.         move.l    d0,d1
  89.         dc.w    _SUPER            ユーザー
  90.         lea    4(sp),sp
  91.         move.l    d1,d0
  92.         movem.l    (sp)+,d3-d7/a3-a6
  93.         rts
  94.  
  95. PicSave
  96.         move.l    sp,stk(a6)        大域脱出用
  97.  
  98.         move.w    6(a0),file(a6)        ファイルハンドルセット
  99.         move.l    8(a0),d0
  100.         move.l    12(a0),d2
  101.         move.l    16(a0),d1
  102.         move.l    20(a0),d3
  103.         bsr    set_xy            座標セット
  104.         move.l    28(a0),d0
  105.         move.l    24(a0),a0
  106.         bsr    バッファセット
  107.  
  108.         move.l    buff_point(a6),a0
  109.         clr.w    (a0)+            予約
  110.         move.w    #15,(a0)+        色のビット数
  111.         move.w    delta_x(a6),(a0)+    Xのサイズセーブ
  112.         move.w    delta_y(a6),(a0)    Yのサイズセーブ
  113.         move.l    #8,-(sp)
  114.         move.l    buff_point(a6),-(sp)
  115.         move.w    file(a6),-(sp)
  116.         dc.w    _WRITE
  117.         tst.l    d0
  118.         bmi    file_error
  119.         lea    10(sp),sp
  120.  
  121.         bsr    色テーブル初期化
  122.         bsr    diff            変化点抽出
  123.         bsr    save
  124.         bsr    flush            ファイルフラッシュ
  125.         clr.l    d0            正常終了
  126.         rts
  127.     .endif
  128.  
  129. *////////////////////////////////////////////////////////////////////////////////////////
  130. *    PicLoad(int file,int X0,int Y0,(char *) Buff,int Size )
  131. *
  132. *    file    ファイルハンドル
  133. *    X0    左上のXの位置
  134. *    Y0    左上のYの位置
  135. *    Buff    バッファのポインタ       ファイル入出力用のバッファです。
  136. *    Size    バッファのサイズ (128以上)
  137. *
  138.  
  139. _PicLoad
  140.         move.l    sp,a1
  141.         movem.l    d3-d7/a3-a6,-(sp)
  142.  
  143.         lea    work(pc),a6        ワークエリアセット
  144.         clr.l    -(sp)
  145.         dc.w    _SUPER            スーパーバイザーセット
  146.         lea    4(sp),sp
  147.         move.l    d0,-(sp)
  148.         bsr    PicLoad
  149.         move.l    d0,d1
  150.  
  151.         dc.w    _SUPER            ユーザー
  152.         lea    4(sp),sp
  153.  
  154.         move.l    d1,d0
  155.         movem.l    (sp)+,d3-d7/a3-a6
  156.         rts
  157.  
  158. PicLoad
  159.         move.l    sp,stk(a6)        大域脱出用
  160.         move.w    6(a1),file(a6)        ファイルハンドル
  161.         move.l    16(a1),a0
  162.         move.l    20(a1),d0
  163.         bsr    バッファセット
  164.         bsr    read_ready
  165.         bsr    get_word
  166.         tst.w    d0
  167.         bne    file_error
  168.         bsr    get_word
  169.         cmp.w    #15,d0
  170.         bne    file_error
  171.         bsr    get_word        Xサイズセット
  172.         sub.w    #1,d0
  173.         and.l    #511,d0
  174.     .if KOPIC.eq.0
  175. *        move.w    d0,_picSizeX+2
  176.     .endif
  177.         move.l    d0,d1
  178.         bsr    get_word        Yサイズセット
  179.         sub.w    #1,d0
  180.         and.l    #511,d0
  181.     .if KOPIC.eq.0
  182. *        move.w    d0,_picSizeY+2
  183.     .endif
  184.         move.l    d0,d3
  185.         move.l    8(a1),d0
  186.         move.l    12(a1),d2
  187.         add.l    d0,d1
  188.         add.l    d2,d3
  189.         bsr    set_xy            座標セット
  190.         bsr    cls
  191.         bsr    色テーブル初期化
  192.         bsr    load
  193.         clr.l    d0
  194.         rts
  195.  
  196. */////////////////////////////////////////////////////////////////////////////////////////
  197. *    ロードのメインです。
  198. load
  199.         move.l    start_addr(a6),a0    開始アドレスセット
  200.         bsr    load_length        変化点までの長さをロード
  201.         move.w    delta_y(a6),d5        Y軸のサイズセット
  202.         sub.w    #1,d5
  203. load_y
  204.         move.w    d5,-(sp)
  205.         move.l    a0,a1
  206.         lea    1024(a0),a0        1行下
  207.         move.l    #0,d4
  208.         move.w    delta_x(a6),d4        X軸のサイズセット
  209. load_x
  210.         cmp.l    d4,d3
  211.         bgt    load2
  212.         sub.w    d3,d4            ちなみにここではワードで大丈夫。
  213.         sub.w    #1,d3
  214.         beq.b    load3
  215.         move.w    d3,d5
  216.         bsr    yoko            横方向戻す。
  217. load3
  218. *        色の読み込みです。
  219.  
  220.         sub.w    #8,d7            まず8ビット読みます。
  221.         bpl.b    load_col2
  222.         move.w    #8,d0
  223.         bsr    load_bit_a
  224.         bra.b    load_col3
  225. load_col2
  226.         rol.w    #8,d6
  227.         move.w    d6,d0
  228. load_col3
  229.         move.b    d0,d2
  230.         bmi    load_col0        msbが1なら、テーブルを見に
  231.         lsl.w    #8,d2            もう8ビット読んで
  232.         sub.w    #8,d7
  233.         bpl.b    load_col4
  234.         move.w    #8,d0
  235.         bsr    load_bit_a
  236.         move.b    d0,d2
  237.         bra    load_col5
  238. load_col4
  239.         rol.w    #8,d6
  240.         move.b    d6,d2
  241. load_col5
  242.         *                さっきのと合わせて15ビットの色にする。
  243.         lsl.w    #1,d2
  244.         move.w    d2,d0
  245.         bsr    新色セット        テーブルにセット
  246.         bra    load_col1
  247. load_col0
  248.         and.w    #$7f,d0
  249.         bsr    色TOP        テーブル内で最新にする
  250.         lsl.w    #3,d0
  251.         move.w    0(a6,d0.w),d2        テーブルから色を取り出す。
  252. load_col1
  253. *
  254.         move.l    a1,a2
  255.         move.w    d2,(a1)+        書く
  256. *
  257. *        連鎖情報読み込み
  258. *
  259.         move.w    d2,d1
  260.         addq.w    #1,d1            lsbセット
  261.         load_b1                1ビット読み込み
  262.         bcc.b    load_chain_e        連鎖なしなら飛ぶ
  263. load_chain_loop
  264.         load_b2                2ビット読む
  265.         beq.b    load_chain0        0なら拡張ビットを読む
  266.         lea    1020(a2),a2        下へ
  267.         add.w    d0,d0
  268.         add.l    d0,a2            さっき読んだ分だけ右へ
  269.         move.w    d1,(a2)
  270.         bra.b    load_chain_loop        次
  271. load_chain0
  272.         load_b1                1ビット読む
  273.         bcc.b    load_chain_e        0なら終わり
  274.         load_b1                1ビット読む
  275.         bcc.b    load_chain1        0なら左2下
  276.         lea    1028(a2),a2        右2下
  277.         move.w    d1,(a2)
  278.         bra.b    load_chain_loop        次
  279. load_chain1
  280.         lea    1020(a2),a2        左2下
  281.         move.w    d1,(a2)
  282.         bra.b    load_chain_loop        次
  283. load_chain_e
  284. *
  285.         bsr    load_length        次の長さ読む
  286.         tst.l    d4            このラインは終わりか?
  287.         bne    load_x            まだなら繰り返し
  288.         bra.b    load1
  289. load2
  290.         move.w    d4,d5            ラインの右まで
  291.         bsr    yoko
  292.         sub.l    d4,d3
  293. load1
  294.         move.w    (sp)+,d5
  295.         dbra    d5,load_y        次のラインへ
  296.         rts
  297.  
  298. */////////////////////////////////////////////////////////////////////////////////////////
  299. *    横方向に戻す
  300. *
  301. yoko
  302.         lsr.w    d5
  303.         bcc    yoko1
  304.         move.w    (a1),d0            奇数なら1ドット分処理
  305.         beq.b    yoko0
  306. yoko6
  307.         move.w    d0,d2            0でなければ新しい色セット
  308.         and.w    #$fffe,d2
  309. yoko0
  310.         move.w    d2,(a1)+        それを書く
  311. yoko1
  312.         dbra    d5,yoko2
  313.         bra.b    yoko7
  314. yoko2
  315.         move.w    d2,d0            d2.lに色セット
  316.         swap    d2
  317.         move.w    d0,d2
  318.         bra.b    yoko4
  319. yoko3        *                2ドットずつ処理
  320.         move.l    d2,(a1)+
  321. yoko4
  322.         move.l    (a1),d0
  323.         dbne    d5,yoko3
  324.         beq.b    yoko8            本当に終わりなら終わり
  325.         swap    d0
  326.         tst.w    d0            1ドットずつ
  327.         beq.b    yoko5
  328.         and.w    #$fffe,d0
  329.         move.w    d0,d2
  330. yoko5
  331.         move.w    d2,(a1)+        次のドット
  332.         swap    d0
  333.         tst.w    d0
  334.         beq.b    yoko0
  335.         bra.b    yoko6
  336. yoko8
  337.         move.l    d2,(a1)+
  338. yoko7
  339.         rts
  340.     .if KOPIC
  341. */////////////////////////////////////////////////////////////////////////////////////////
  342. *    セーブのメイン
  343. *
  344. save
  345.         move.w    #1,d4
  346.         move.l    start_addr(a6),a0    開始アドレス
  347.         clr.l    d3
  348.         move.w    delta_y(a6),d1
  349.         sub.w    #1,d1
  350. save0
  351.         move.l    a0,a1
  352.         lea    1024(a0),a0
  353.         move.w    delta_x(a6),d2
  354.         subq.w    #1,d2
  355. save1
  356.         add.l    #1,d3            変化点迄の長さ
  357.         move.w    (a1)+,d0
  358.         and.w    d4,d0
  359.         dbne    d2,save1
  360.         beq.b    save2
  361.         move.l    d3,d0
  362.         bsr    save_length        長さセーブ
  363.         move.w    -2(a1),d0
  364.         eor.w    d4,d0
  365.         bsr    save_color        色セーブ
  366.         bsr    save_chain        連鎖セーブ
  367.         eor.w    d4,-2(a1)
  368.         moveq.l    #0,d3
  369.         dbra    d2,save1
  370. save2
  371.         dbra    d1,save0
  372.         add.l    #1,d3            おまけのセーブ
  373.         move.l    d3,d0
  374.         bsr    save_length
  375.         rts
  376.  
  377. */////////////////////////////////////////////////////////////////////////////////////////
  378. *    連鎖のセーブ
  379. *
  380. save_chain
  381.         movem.l    d1-d3,-(sp)
  382.         lea    -2(a1),a2
  383.         move.w    (a2),d6
  384.         move.l    a2,d5            左右のクリッピング用
  385.         and.w    #$3ff,d5
  386.         move.l    #0,d7
  387.         move.w    d1,-(sp)
  388.         bra    save_chain14
  389. save_chain_loop
  390.         move.w    d1,-(sp)
  391.  
  392.         lea    1024(a2),a2        1ライン下へ
  393.         cmp.w    (a2),d6            同じ色でなければ次
  394.         bne.b    save_chain0
  395.         move.w    #%10,d0
  396.         move.w    #2,d1
  397.         bra    save_chain9
  398. save_chain0
  399.         lea    -2(a2),a2        左へ
  400.         sub.w    #2,d5
  401.         cmp.w    left(a6),d5        左範囲チェック
  402.         blt.b    save_chain1
  403.         cmp.w    (a2),d6            同じ色でなければ次
  404.         bne.b    save_chain1
  405.         move.w    #%01,d0
  406.         move.w    #2,d1
  407.         bra    save_chain9
  408. save_chain1
  409.         lea    4(a2),a2        右へ
  410.         add.w    #4,d5
  411.         cmp.w    right(a6),d5        右チェック
  412.         bgt.b    save_chain2
  413.         cmp.w    (a2),d6            同じ色でなければ次
  414.         bne.b    save_chain2
  415.         move.w    #%11,d0
  416.         move.w    #2,d1
  417.         bra    save_chain9
  418. save_chain2
  419.         lea    -6(a2),a2        左2
  420.         sub.w    #6,d5
  421.         cmp.w    left(a6),d5        左チェック
  422.         blt.b    save_chain3
  423.         cmp.w    (a2),d6            同じ色でなければ次
  424.         bne.b    save_chain3
  425.         move.w    #%0010,d0
  426.         move.w    #4,d1
  427.         bra    save_chain9
  428. save_chain3
  429.         lea    8(a2),a2        右2
  430.         add.w    #8,d5
  431.         cmp.w    right(a6),d5        右チェック
  432.         bgt.b    save_chain4
  433.         cmp.w    (a2),d6            同じ色でなければ次
  434.         bne.b    save_chain4
  435.         move.w    #%0011,d0
  436.         move.w    #4,d1
  437. save_chain9
  438.         eor.w    d4,(a2)
  439.         tst.w    d7            1回目か
  440.         bne    save_chain10
  441.         move.w    #1,d7
  442.         movem.w    d0-d1,-(sp)
  443.         move.w    #1,d0
  444.         move.w    d0,d1
  445.         bsr    save_bit        1回目の時に連鎖有りを書く
  446.         movem.w    (sp)+,d0-d1
  447. save_chain10
  448.         bsr    save_bit        ビット書く
  449. save_chain14
  450.         move.w    (sp)+,d1
  451.         dbra    d1,save_chain_loop
  452. save_chain13
  453.         tst.w    d7
  454.         beq    save_chain11
  455.         move.w    #0,d0            連鎖があった時は、3ビット0で終わり
  456.         move.w    #3,d1
  457.         bsr    save_bit
  458.         bra    save_chain12
  459. save_chain11
  460.         move.w    #0,d0            終わりのビット
  461.         move.w    #1,d1
  462.         bsr    save_bit
  463. save_chain12
  464.         movem.l    (sp)+,d1-d3
  465.         rts
  466. save_chain4
  467.         move.w    (sp)+,d1
  468.         bra    save_chain13
  469.     .endif
  470. *****************************************************************************************
  471. *                                            *
  472. *    パラメータセット                                *
  473. *                                            *
  474. *****************************************************************************************
  475.  
  476. *///////////////////////////////////////////////////////////////////////////////////////
  477. *    X,Yの位置をセット
  478. *    (d0,d1)-(d2,d3)
  479.  
  480. set_xy
  481.         movem.l    d0-d4,-(sp)
  482.         move.w    d0,x0(a6)
  483.         move.w    d1,x1(a6)
  484.         move.w    d2,y0(a6)
  485.         move.w    d3,y1(a6)
  486.         cmp.w    d0,d1            サイズをチェック
  487.         blt    size_error
  488.         cmp.w    d2,d3
  489.         blt    size_error
  490.         cmp.w    #512,d0
  491.         bge    size_error
  492.         cmp.w    #512,d1
  493.         bge    size_error
  494.         cmp.w    #512,d2
  495.         bge    size_error
  496.         cmp.w    #512,d3
  497.         bge    size_error
  498.         move.w    d1,d4            幅
  499.         sub.w    d0,d4
  500.         add.w    #1,d4
  501.         move.w    d4,delta_x(a6)
  502.         move.w    d3,d4
  503.         sub.w    d2,d4
  504.         add.w    #1,d4
  505.         move.w    d4,delta_y(a6)
  506.         moveq.l    #0,d4
  507.         move.w    d2,d4
  508.         lsl.l    #5,d4
  509.         lsl.l    #5,d4
  510.         add.l    d0,d0
  511.         move.w    d0,left(a6)        左の位置
  512.         add.l    d0,d4
  513. *        add.l    #$c00000,d4
  514.         add.l    _PicBUFADR,d4
  515.         move.l    d4,start_addr(a6)    開始点
  516.         moveq.l    #0,d4
  517.         move.w    d3,d4
  518.         lsl.l    #5,d4
  519.         lsl.l    #5,d4
  520.         add.l    d1,d1
  521.         move.w    d1,right(a6)        右の位置
  522.         add.l    d1,d4
  523. *        add.l    #$c00000,d4
  524.         add.l    _PicBUFADR,d4
  525.         move.l    d4,end_addr(a6)        終わり点
  526.         movem.l    (sp)+,d0-d4
  527.         rts
  528.  
  529. *****************************************************************************************
  530. *                                            *
  531. *    クリアと変化点抽出                                *
  532. *                                            *
  533. *****************************************************************************************
  534.  
  535. *////////////////////////////////////////////////////////////////////////////////////////
  536. *    画面をクリアする
  537.  
  538. cls
  539.         movem.l    d0-d7/a0-a5,-(sp)
  540.         move.w    delta_x(a6),d0
  541.         move.w    d0,d1
  542.         and.w    #15,d1
  543.         lsr.w    #4,d0
  544.         move.w    delta_y(a6),d2
  545.         subq.w    #1,d2
  546.         move.l    end_addr(a6),a5
  547.         add.l    #2,a5
  548.         moveq.l    #0,d4
  549.         move.l    d4,d5
  550.         move.l    d5,d6
  551.         move.l    d6,d7
  552.         move.l    d7,a0
  553.         move.l    a0,a1
  554.         move.l    a1,a2
  555.         move.l    a2,a3
  556. cls_lopy
  557.         move.l    a5,a4
  558.         lea    -1024(a5),a5
  559.         move.w    d1,d3
  560.         bra    cls_x0
  561. cls_lopx0
  562.         clr.w    -(a4)            16ドット未満を1ドットずつクリア
  563. cls_x0
  564.         dbra    d3,cls_lopx0
  565.         move.w    d0,d3
  566.         bra    cls_x1
  567. cls_lopx1
  568.         movem.l    d4-d7/a0-a3,-(a4)    16ドットずつクリア
  569. cls_x1
  570.         dbra    d3,cls_lopx1
  571.  
  572.         dbra    d2,cls_lopy
  573.         movem.l    (sp)+,d0-d7/a0-a5
  574.         rts
  575.     .if KOPIC
  576. *////////////////////////////////////////////////////////////////////////////////////////
  577. *    変化点抽出
  578.  
  579. diff
  580.         move.w    #1,d4
  581.         move.w    #$fffe,d5
  582.         move.l    start_addr(a6),a0
  583.         move.w    (a0),d0
  584.         not.w    d0
  585.         move.w    delta_y(a6),d1
  586.         subq.w    #1,d1
  587. diff0
  588.         move.l    a0,a1
  589.         lea    1024(a0),a0
  590.         move.w    delta_x(a6),d2
  591.         subq.w    #1,d2
  592. diff1
  593.         and.w    d5,(a1)            下位ビットクリア
  594.         move.w    (a1)+,d3
  595.         cmp.w    d3,d0            前の色とチェック
  596.         beq.b    diff2
  597.         or.w    d4,-2(a1)        違えば下位ビットセット
  598. diff2
  599.         move.w    d3,d0
  600.         dbra    d2,diff1
  601.         dbra    d1,diff0
  602.         rts
  603.  
  604. *****************************************************************************************
  605. *                                            *
  606. *    ファイルの制御                                    *
  607. *                                            *
  608. *****************************************************************************************
  609.  
  610. *///////////////////////////////////////////////////////////////////////////////////////
  611. *    色を書く    d0
  612.  
  613. save_color
  614.         movem.l    d0-d1,-(sp)
  615.         bsr    色サーチ        テーブルにあるか?
  616.         tst.w    d1
  617.         bmi    save_col0
  618.         or.w    #$80,d1            テーブルにあったら
  619.         move.l    d1,d0            テーブルの位置をセーブ
  620.         move.l    #8,d1
  621.         bsr    save_bit
  622.         bra    save_col1
  623. save_col0
  624.         lsr.w    d0
  625.         move.w    #16,d1            色セーブ
  626.         bsr    save_bit
  627. save_col1
  628.         movem.l    (sp)+,d0-d1
  629.         rts
  630.  
  631. ********************************************************************************
  632. *    長さをセーブ
  633. *
  634.  
  635. save_length    * in d0
  636.         movem.l    d0-d5,-(sp)
  637.         move.l    d0,d5
  638.         moveq.l    #0,d2
  639.         move.l    d2,d4
  640.         move.l    #1,d3
  641. save_lenLop                * Wyle符号の長さ
  642.         add.w    #1,d2
  643.         add.l    d3,d3
  644.         add.l    d3,d4
  645.         cmp.l    d4,d5
  646.         bgt    save_lenLop
  647.  
  648.         add.l    #1,d5
  649.         sub.l    d3,d5
  650.         cmp.w    #8,d2
  651.         bgt    save_len0    8ドットより長い時は飛ぶ
  652.         move.l    #$fffe,d0
  653.         move.w    d2,d1
  654.         bsr    save_bit
  655.         move.l    d5,d0
  656.         bsr    save_bit    セーブ
  657.         bra    save_len1
  658. save_len0
  659.         move.l    #$ffff,d0
  660.         move.w    #8,d1
  661.         bsr    save_bit
  662.         move.l    #$fffe,d0
  663.         move.w    d2,d1
  664.         sub.w    #8,d1
  665.         bsr    save_bit
  666.         move.l    d5,d0
  667.         lsr.l    #8,d0
  668.         move.w    d2,d1
  669.         sub.w    #8,d1
  670.         bsr    save_bit
  671.         move.l    d5,d0
  672.         move.w    #8,d1
  673.         bsr    save_bit
  674. save_len1
  675.         movem.l    (sp)+,d0-d5
  676.         rts
  677.     .endif
  678. ********************************************************************************
  679. *    長さをロード
  680. *
  681.  
  682. load_length
  683.         move.w    #-1,d5
  684. load_lenLop
  685.         dbra    d7,load_len3
  686.         move.w    #1,d0
  687.         bsr    load_bit_a
  688.         lsr.w    d0
  689.         dbcc    d5,load_lenLop
  690.         bra.b    load_len2
  691. load_len3
  692.         lsl.w    d6
  693.         dbcc    d5,load_lenLop        Wyle符号長?
  694. load_len2
  695.         neg.w    d5
  696.         move.l    #1,d3
  697.         lsl.l    d5,d3
  698.  
  699.         cmp.w    #8,d5            8より長い時は2回に分ける
  700.         bgt.b    load_len0
  701.         move.w    d5,d0
  702.         sub.w    d0,d7
  703.         bpl.b    load_len5
  704.         bsr    load_bit_a
  705.         bra    load_len1
  706. load_len5
  707.         swap    d6
  708.         clr.w    d6
  709.         rol.l    d0,d6
  710.         move.w    d6,d0
  711.         swap    d6
  712.         bra    load_len1
  713. load_len0
  714.         move.w    d5,d0
  715.         sub.w    #8,d0
  716.         sub.w    d0,d7
  717.         bpl.b    load_len6
  718.         bsr    load_bit_a
  719.         bra    load_len7
  720. load_len6
  721.         swap    d6
  722.         clr.w    d6
  723.         rol.l    d0,d6
  724.         move.w    d6,d0
  725.         swap    d6
  726. load_len7
  727.         move.l    #0,d1
  728.         move.w    d0,d1
  729.         move.w    #8,d0
  730.         lsl.l    d0,d1
  731.         sub.w    d0,d7
  732.         bpl.b    load_len8
  733.         bsr    load_bit_a
  734.         bra    load_len9
  735. load_len8
  736.         rol.w    #8,d6
  737.         move.w    d6,d0
  738.         and.w    #255,d0
  739. load_len9
  740.         move.b    d0,d1
  741.         move.w    d1,d0
  742. load_len1
  743.         and.l    #$ffff,d0
  744.         add.l    d0,d3
  745.         sub.l    #1,d3
  746.         rts
  747.  
  748. *////////////////////////////////////////////////////////////////////////////////////////
  749. *    ビット読み込み
  750. *    in        d0 = bits length
  751. *    out        d0 = data
  752.  
  753. load_bit
  754.         sub.w    d0,d7            ビットポイントチェック
  755.         blt.b    load_bit_a
  756.         swap    d6
  757.         clr.w    d6
  758.         rol.l    d0,d6
  759.         move.w    d6,d0
  760.         swap    d6
  761.         rts
  762. load_bit_a
  763.         add.w    d0,d7
  764.         addq.w    #1,d7
  765.         and.l    #$ffff,d6
  766.         lsl.l    d7,d6
  767.         sub.w    d7,d0
  768.         move.w    d0,d7
  769.  
  770.         subq.l    #2,buff_lest(a6)    
  771.         bne.b    load_bit0        必要があれば次のバッファ読む
  772.  
  773.         move.l    buff_addr(a6),a5
  774.         move.l    buff_size(a6),-(sp)
  775.         move.l    buff_addr(a6),-(sp)
  776.         move.w    file(a6),-(sp)
  777.         dc.w    _READ
  778.         lea    10(sp),sp
  779.         move.l    d0,buff_lest(a6)
  780.         bmi    file_error
  781. load_bit0
  782.         move.w    (a5)+,d6
  783.         lsl.l    d7,d6
  784.         neg.w    d7
  785.         add.w    #15,d7
  786.         move.l    d6,d0
  787.         swap    d0
  788. load_bit_e
  789.         rts
  790.  
  791. *////////////////////////////////////////////////////////////////////////////////////////
  792. *    1ワード読む(ただし、ビット区切りをする前)
  793. * out        d0 = data
  794.  
  795. get_word
  796.         subq.l    #2,buff_lest(a6)
  797.         bne.b    get_word0
  798.  
  799.         move.l    buff_addr(a6),a5
  800.         move.l    buff_size(a6),-(sp)
  801.         move.l    buff_addr(a6),-(sp)
  802.         move.w    file(a6),-(sp)
  803.         dc.w    _READ
  804.         lea    10(sp),sp
  805.         move.l    d0,buff_lest(a6)
  806.         bmi    file_error
  807. get_word0
  808.         move.w    d6,d0
  809.         move.w    (a5)+,d6
  810.         rts
  811.  
  812. *////////////////////////////////////////////////////////////////////////////////////////
  813. *    読み込みのための用意
  814.  
  815. read_ready
  816.         move.l    buff_addr(a6),a5
  817.         move.l    buff_size(a6),-(sp)
  818.         move.l    buff_addr(a6),-(sp)
  819.         move.w    file(a6),-(sp)
  820.         dc.w    _READ
  821.         lea    10(sp),sp
  822.         move.l    d0,buff_lest(a6)
  823.         bmi    file_error
  824.         move.w    (a5)+,d6
  825.         rts
  826.     .if KOPIC
  827. ********************************************************************************
  828. *    d0 : data
  829. *    d1 : bit (1~16)
  830.  
  831. save_bit
  832.         movem.l    d0-d2/a0,-(sp)
  833.         move.w    #16,d2
  834.         sub.w    d1,d2
  835.         lsl.w    d2,d0
  836.  
  837.         move.l    buff_point(a6),a0
  838.         cmp.w    bit_point(a6),d1
  839.         bgt    save_bit0
  840.         sub.w    d1,bit_point(a6)
  841.         swap    d0
  842.         move.w    (a0),d0
  843.         rol.l    d1,d0
  844.         move.w    d0,(a0)
  845.         bra    save_bit1
  846. save_bit0
  847.         move.w    bit_point(a6),d2
  848.         addq.w    #1,d2
  849.         swap    d0
  850.         move.w    (a0),d0
  851.         rol.l    d2,d0
  852.         move.w    d0,(a0)
  853.         bsr    buff_write
  854.         move.l    buff_point(a6),a0
  855.         neg.w    d2
  856.         add.w    d1,d2
  857.         rol.l    d2,d0
  858.         move.w    d0,(a0)
  859.         neg.w    d2
  860.         add.w    #15,d2
  861.         move.w    d2,bit_point(a6)
  862. save_bit1
  863.         movem.l    (sp)+,d0-d2/a0
  864.         rts
  865.  
  866. *////////////////////////////////////////////////////////////////////////////////////////
  867. *    バッファのポインタを1つ進め一杯になったらファイルに書き込む。
  868.  
  869. buff_write
  870.         move.l    d0,-(sp)
  871.         addq.l    #2,buff_point(a6)
  872.         subq.l    #2,buff_lest(a6)
  873.         bne    buff_write_0
  874.         move.l    buff_size(a6),buff_lest(a6)
  875.         move.l    buff_addr(a6),buff_point(a6)
  876.         move.l    buff_size(a6),-(sp)
  877.         move.l    buff_addr(a6),-(sp)
  878.         move.w    file(a6),-(sp)
  879.         dc.w    _WRITE
  880.         lea    10(sp),sp
  881.         tst.l    d0
  882.         bmi    file_error
  883. buff_write_0
  884.         move.l    (sp)+,d0
  885.         rts
  886.  
  887. *////////////////////////////////////////////////////////////////////////////////////////
  888. *    書き込みバッファのフラッシュ
  889.  
  890. flush
  891.         movem.l    d0-d1/a0,-(sp)
  892.         move.w    bit_point(a6),d0
  893.         move.l    buff_point(a6),a0
  894.         move.w    (a0),d1        
  895.         add.w    #1,d0
  896.         lsl.w    d0,d1
  897.         move.w    d1,(a0)
  898.         bsr    buff_write
  899.         move.l    buff_size(a6),d0
  900.         sub.l    buff_lest(a6),d0
  901.         move.l    d0,-(sp)
  902.         move.l    buff_addr(a6),-(sp)
  903.         move.w    file(a6),-(sp)
  904.         dc.w    _WRITE
  905.         lea    10(sp),sp
  906.         tst.l    d0
  907.         bmi    file_error
  908.         movem.l    (sp)+,d0-d1/a0
  909.         rts
  910.     .endif
  911. *////////////////////////////////////////////////////////////////////////////////////////
  912. *    バッファをセットします。
  913. *
  914. * in        d0 = buff size
  915. * out        a0 = buff address
  916.  
  917. バッファセット
  918.         and.l    #$ffff_fffe,d0
  919.         cmp.l    #128,d0
  920.         blt    buff_error
  921.         move.l    d0,buff_size(a6)
  922.         move.l    d0,buff_lest(a6)
  923.         move.l    a0,buff_addr(a6)
  924.         move.l    a0,buff_point(a6)
  925.         move.w    #15,bit_point(a6)
  926.         move.w    #15,d7
  927.         rts
  928.  
  929. *****************************************************************************************
  930. *                                            *
  931. *    色のテーブルの処理                                *
  932. *                                            *
  933. *****************************************************************************************
  934.  
  935. * 128の色テーブルが有り、過去128色分がテーブルに登録されている。
  936. * 新しい色が来たら、それがテーブルにあればそれを最新にする。なければ
  937. * 最も古いのをテーブルから追い出しそこにセット。
  938. * これによって、テーブルにある色は、フラグと合わせ8ビットになるのでその分得です。
  939.  
  940. *////////////////////////////////////////////////////////////////////////////////////////
  941. * 最新にします。
  942. * in        d0.w = point
  943. *
  944.  
  945. 色TOP
  946.         movem.w    d0-d2,-(sp)
  947.         lsl.w    #3,d0
  948.         cmp.w    color_new(a6),d0
  949.         beq    色TOP0
  950.         move.w    2(a6,d0.w),d1
  951.         move.w    4(a6,d0.w),d2
  952.         move.w    d1,2(a6,d2.w)
  953.         move.w    d2,4(a6,d1.w)
  954.         move.w    color_new(a6),d1
  955.         move.w    2(a6,d1.w),d2
  956.         move.w    d0,2(a6,d1.w)
  957.         move.w    d2,2(a6,d0.w)
  958.         move.w    d0,4(a6,d2.w)
  959.         move.w    d1,4(a6,d0.w)
  960.         move.w    d0,color_new(a6)
  961. 色TOP0
  962.         movem.w    (sp)+,d0-d2
  963.         rts
  964.  
  965. *////////////////////////////////////////////////////////////////////////////////////////
  966. * テーブルを見て、あれば最新無ければ登録します。
  967. * in        d0.w = color
  968. * out        d1.w = 0-127 / -1
  969. *
  970.  
  971. 色サーチ
  972.         movem.l    d0/a0,-(sp)
  973.         lea    -8(a6),a0
  974.         move.w    #128-1,d1
  975. 色サーチLOOP
  976.         lea    8(a0),a0
  977.         cmp.w    (a0),d0
  978.         dbeq    d1,色サーチLOOP
  979.         bne    色サーチ0
  980.         not.w    d1
  981.         and.w    #127,d1
  982.         move.w    d1,d0
  983.         bsr    色TOP
  984.         move.w    d0,d1
  985.         bra    色サーチ1
  986. 色サーチ0
  987.         bsr    新色セット
  988.         move.w    #-1,d1
  989. 色サーチ1
  990.         movem.l    (sp)+,d0/a0
  991.         rts
  992.  
  993. *////////////////////////////////////////////////////////////////////////////////////////
  994. *
  995. * in        d0.w = color
  996. * out        none
  997. *
  998.  
  999. 新色セット
  1000.         move.w    d1,-(sp)
  1001.         move.w    color_new(a6),d1
  1002.         move.w    2(a6,d1.w),d1
  1003.         move.w    d1,color_new(a6)
  1004.         move.w    d0,0(a6,d1.w)
  1005.         move.w    (sp)+,d1
  1006.         rts
  1007.  
  1008. *////////////////////////////////////////////////////////////////////////////////////////
  1009. *
  1010.  
  1011. 色テーブル初期化
  1012.         movem.l    d0-d2/a0,-(sp)
  1013.         move.l    a6,a0
  1014.         move.w    #1*8,d1
  1015.         move.w    #127*8,d2
  1016.         move.w    #128-1,d0
  1017. 色初期化LOOP
  1018.         clr.w    (a0)+
  1019.         move.w    d1,(a0)+
  1020.         addq.w    #8,d1
  1021.         cmp.w    #128*8,d1
  1022.         bne    色初期化0
  1023.         clr.w    d1
  1024. 色初期化0
  1025.         move.w    d2,(a0)
  1026.         addq.w    #8,d2
  1027.         cmp.w    #128*8,d2
  1028.         bne    色初期化1
  1029.         clr.w    d2
  1030. 色初期化1
  1031.         lea    4(a0),a0
  1032.         dbra    d0,色初期化LOOP
  1033.         clr.w    color_new(a6)
  1034.         movem.l    (sp)+,d0-d2/a0
  1035.         rts
  1036.  
  1037.  
  1038. *****************************************************************************************
  1039. *                                            *
  1040. *    エラールーチン                                    *
  1041. *                                            *
  1042. *****************************************************************************************
  1043.  
  1044. buff_error            *メモリーが足りません。
  1045.         move.l    #1,d0
  1046.         bra    大域脱出
  1047. file_error            *ファイルエラー。
  1048.         move.l    #2,d0
  1049.         bra    大域脱出
  1050. size_error            *位置の指定に誤りがあります。
  1051.         move.l    #3,d0
  1052.         bra    大域脱出
  1053. 大域脱出
  1054.         move.l    stk(a6),sp
  1055.         rts
  1056.  
  1057. *****************************************************************************************
  1058. *                                            *
  1059. *    変数領域                                    *
  1060. *                                            *
  1061. *****************************************************************************************
  1062.  
  1063.         .dc.b    "--PIC Ver1.00 By 柳沢明--",0
  1064.                         *ただの落書きです
  1065.         .even
  1066.         .offset    0
  1067.  
  1068. color_table:    .ds.w    128*4            色のテーブル用
  1069. color_new:    .ds.w    1            最新のポイント
  1070.  
  1071. x0:        .ds.w    1
  1072. x1:        .ds.w    1
  1073. y0:        .ds.w    1
  1074. y1:        .ds.w    1
  1075. start_addr:    .ds.l    1
  1076. end_addr:    .ds.l    1
  1077. delta_x:    .ds.w    1
  1078. delta_y:    .ds.w    1
  1079. left:        .ds.w    1
  1080. right:        .ds.w    1
  1081.  
  1082. buff_addr:    .ds.l    1
  1083. buff_size:    .ds.l    1
  1084.  
  1085. buff_point:    .ds.l    1
  1086. buff_lest:    .ds.l    1
  1087. bit_point:    .ds.w    1
  1088. file:        .ds.w    1
  1089. stk:        .ds.l    1
  1090.  
  1091. work_size:
  1092.         .text
  1093.  
  1094. work:        .ds.b    work_size
  1095.  
  1096.         .end
  1097.